From: awilliam@xenbuild.aw Date: Mon, 24 Jul 2006 19:48:12 +0000 (-0600) Subject: [IA64] Fix fetch code method when FP fault occurs @VTi side X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~15786^2~19 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=602e69d32065b7168f30ba71e23a728c85b90ef8;p=xen.git [IA64] Fix fetch code method when FP fault occurs @VTi side This patch intends to use __vmx_get_domain_bundle to fetch code when FP fault @VTi side. Singed-off-by: Zhang xiantao --- diff --git a/xen/arch/ia64/vmx/mmio.c b/xen/arch/ia64/vmx/mmio.c index 01950bc7f6..8890f50523 100644 --- a/xen/arch/ia64/vmx/mmio.c +++ b/xen/arch/ia64/vmx/mmio.c @@ -421,7 +421,6 @@ static void write_ipi (VCPU *vcpu, uint64_t addr, uint64_t value) dir 1: read 0:write inst_type 0:integer 1:floating point */ -extern IA64_BUNDLE __vmx_get_domain_bundle(u64 iip); #define SL_INTEGER 0 // store/load interger #define SL_FLOATING 1 // store/load floating diff --git a/xen/arch/ia64/xen/faults.c b/xen/arch/ia64/xen/faults.c index b30470e6ab..78cbeb035b 100644 --- a/xen/arch/ia64/xen/faults.c +++ b/xen/arch/ia64/xen/faults.c @@ -314,7 +314,6 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr) { struct vcpu *v = current; IA64_BUNDLE bundle; - IA64_BUNDLE __get_domain_bundle(UINT64); unsigned long fault_ip; fpswa_ret_t ret; @@ -325,7 +324,12 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr) */ if (!fp_fault && (ia64_psr(regs)->ri == 0)) fault_ip -= 16; - bundle = __get_domain_bundle(fault_ip); + + if (VMX_DOMAIN(current)) + bundle = __vmx_get_domain_bundle(fault_ip); + else + bundle = __get_domain_bundle(fault_ip); + if (!bundle.i64[0] && !bundle.i64[1]) { printk("%s: floating-point bundle at 0x%lx not mapped\n", __FUNCTION__, fault_ip); diff --git a/xen/arch/ia64/xen/privop.c b/xen/arch/ia64/xen/privop.c index cb216ecbee..e0e25ab49a 100644 --- a/xen/arch/ia64/xen/privop.c +++ b/xen/arch/ia64/xen/privop.c @@ -507,7 +507,6 @@ static IA64FAULT priv_handle_op(VCPU *vcpu, REGS *regs, int privlvl) { IA64_BUNDLE bundle; - IA64_BUNDLE __get_domain_bundle(UINT64); int slot; IA64_SLOT_TYPE slot_type; INST64 inst; diff --git a/xen/arch/ia64/xen/vcpu.c b/xen/arch/ia64/xen/vcpu.c index c3d0fe2543..9ccb13f2ea 100644 --- a/xen/arch/ia64/xen/vcpu.c +++ b/xen/arch/ia64/xen/vcpu.c @@ -31,7 +31,6 @@ extern void getfpreg (unsigned long regnum, struct ia64_fpreg *fpval, struct pt_ extern void setfpreg (unsigned long regnum, struct ia64_fpreg *fpval, struct pt_regs *regs); extern void panic_domain(struct pt_regs *, const char *, ...); -extern IA64_BUNDLE __get_domain_bundle(UINT64); typedef union { struct ia64_psr ia64_psr; diff --git a/xen/include/asm-ia64/bundle.h b/xen/include/asm-ia64/bundle.h index 531a4aa9eb..a2e44a4852 100644 --- a/xen/include/asm-ia64/bundle.h +++ b/xen/include/asm-ia64/bundle.h @@ -223,6 +223,9 @@ typedef union U_INST64 { INST64_M47 M47; // purge translation entry } INST64; +extern IA64_BUNDLE __vmx_get_domain_bundle(unsigned long iip); +extern IA64_BUNDLE __get_domain_bundle(unsigned long iip); + #define MASK_41 ((unsigned long)0x1ffffffffff) #endif /* _XEN_IA64_BUNDLE_H */